package com.yumingjiang.common.util;

import java.security.*;
import java.util.Arrays;

public class RSAUtils {
    private static final String RSA_ALGORITHM = "RSA";
    private static final String SIGN_ALGORITHM = "SHA256withRSA";
    private static final int DEFAULT_KEY_SIZE = 2048; // 默认密钥长度

    // 支持的密钥长度列表
    private static final int[] VALID_KEY_SIZES = {1024, 2048, 4096};

    private RSAUtils() {}

    /**
     * 生成RSA密钥对（使用默认密钥长度）
     */
    public static KeyPair generateKeyPair() throws NoSuchAlgorithmException {
        return generateKeyPair(DEFAULT_KEY_SIZE);
    }

    /**
     * 生成RSA密钥对（自定义密钥长度）
     */
    public static KeyPair generateKeyPair(int keySize) throws NoSuchAlgorithmException {
        validateKeySize(keySize);
        
        KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(RSA_ALGORITHM);
        keyPairGen.initialize(keySize);
        return keyPairGen.generateKeyPair();
    }

    /**
     * 校验密钥长度合法性
     */
    private static void validateKeySize(int keySize) {
        for (int validSize : VALID_KEY_SIZES) {
            if (keySize == validSize) return;
        }
        throw new IllegalArgumentException("Invalid key size: " + keySize 
            + ". Supported sizes: " + Arrays.toString(VALID_KEY_SIZES));
    }

    // 保留原有加密/解密/签名/验签方法，以下仅展示改动部分...

    /**
     * 获取公钥加密的最大明文长度
     */
    public static int getMaxEncryptBlockSize(PublicKey publicKey) {
        int keySize = getKeySize(publicKey);
        return (keySize / 8) - 11; // PKCS#1 v1.5 padding占用11字节
    }

    /**
     * 获取私钥解密的最大密文长度
     */
    public static int getMaxDecryptBlockSize(PrivateKey privateKey) {
        int keySize = getKeySize(privateKey);
        return keySize / 8;
    }

    /**
     * 从密钥中提取密钥长度
     */
    private static int getKeySize(Key key) {
        byte[] encoded = key.getEncoded();
        if (encoded == null || encoded.length < 5) return -1;
        return (encoded[3] & 0xFF) << 24 | (encoded[2] & 0xFF) << 16 
             | (encoded[1] & 0xFF) << 8 | (encoded[0] & 0xFF);
    }
}